package jp.ac.waseda.cs.washi.game.api;

import jp.ac.waseda.cs.washi.game.Starter;

/**
 * このクラスはテストゲームを実行するためのメソッドを提供します。
 */
public final class GameInvoker {
	private GameInvoker() {
	}

	/**
	 * 標準のゲーム時間とFPSで指定した2人のプレイヤーのデバッグ用設定のテストゲームを開始します。 （1ターンの時間制限がありません）
	 * 
	 * @param mapIndex
	 *            プレイするマップ番号（1～5）
	 */
	public static void startForUserPlaying(int mapIndex) {
		start(null, null, mapIndex, 10.0, true, false, false);
	}

	/**
	 * 標準のゲーム時間とFPSで指定した2人のプレイヤーのデバッグ用設定のテストゲームを開始します。 （1ターンの時間制限がありません）
	 * 
	 * @param player1
	 *            プレイヤー1
	 * @param player2
	 *            プレイヤー2
	 * @param mapIndex
	 *            プレイするマップ番号（1～5）
	 */
	public static void startForDebug(Player player1, Player player2,
			int mapIndex) {
		start(player1, player2, mapIndex, 60.0, false, false, false);
	}

	/**
	 * 標準のゲーム時間と指定したFPSと2人のプレイヤーのデバッグ用設定のテストゲームを開始します。 （1ターンの時間制限がありません）
	 * 
	 * @param player1
	 *            プレイヤー1
	 * @param player2
	 *            プレイヤー2
	 * @param mapIndex
	 *            プレイするマップ番号（1～5）
	 * @param fps
	 *            FPS（ゲーム速度）
	 */
	public static void startForDebug(Player player1, Player player2,
			int mapIndex, double fps) {
		start(player1, player2, mapIndex, fps, false, false, false);
	}

	/**
	 * 標準のゲーム時間とFPSで指定した2人のプレイヤーのテストゲームを開始します。
	 * 
	 * @param player1
	 *            プレイヤー1
	 * @param player2
	 *            プレイヤー2
	 * @param mapIndex
	 *            プレイするマップ番号（1～5）
	 */
	public static void startForContest(Player player1, Player player2,
			int mapIndex) {
		start(player1, player2, mapIndex, 60.0, false, true, true);
	}

	/**
	 * 標準のゲーム時間と指定したFPSと2人のプレイヤーのテストゲームを開始します。
	 * 
	 * @param player1
	 *            プレイヤー1
	 * @param player2
	 *            プレイヤー2
	 * @param mapIndex
	 *            プレイするマップ番号（1～5）
	 * @param fps
	 *            FPS（ゲーム速度）
	 */
	public static void startForContest(Player player1, Player player2,
			int mapIndex, double fps) {
		start(player1, player2, mapIndex, fps, false, true, true);
	}

	/**
	 * 指定した時間制限の有無，例外無視の有無，FPSと2人のプレイヤーのテストゲームを開始します。
	 * 
	 * @param player1
	 *            プレイヤー1
	 * @param player2
	 *            プレイヤー2
	 * @param fps
	 *            FPS（ゲーム速度）
	 * @param playingUser
	 *            キーボードでユーザーがプレイするか否か
	 * @param limittingTime
	 *            スレッドによる時間制限の有無
	 * @param ignoringException
	 *            例外が発生した際にプログラムを止めるか否か
	 */
	public static void start(Player player1, Player player2, int mapIndex,
			double fps, boolean playingUser, boolean limittingTime,
			boolean ignoringException) {
		Starter.start(player1, player2, mapIndex, 0, 1000, fps, playingUser,
				limittingTime, ignoringException, false, null);
	}
}
